home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / GRAPHICS / TOOLS / TGDN / Docs / Technical < prev    next >
Text File  |  1996-12-01  |  25KB  |  523 lines

  1.  
  2.                          Technical details
  3.                          =================
  4. .————————————.
  5. | Nº | Topic |
  6. '————+———————'
  7.   01 | Animations and animation viewers
  8.   02 | Exporting textures as JPEGs
  9.   03 | Creating 16 and 24 bpp files
  10.   04 | Menu tree conventions
  11.   05 | Animation Types - details
  12.   06 | Animation Types - file format
  13.   07 | The Mutator
  14.   08 | Breeding
  15.   09 | Three-dimensional sculpting
  16.   10 | Dithering
  17.   11 | Resizing
  18.   12 | Batch processing
  19.   13 | Using !ChangeFSI
  20.   14 | Virtual sprites and layering
  21.   15 | Milking the Freeware version
  22.   16 | Bump mapping
  23.  
  24.  
  25. 01 Animations and animation viewers
  26. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27. Texture Garden contains extensive options for generating texture animations.
  28. Animations may have variable number of frames, and they may be controlled
  29. by using animation types.
  30.  
  31. Animations are always replayed cyclicly, but their direction may be reversed by
  32. the user.
  33.  
  34. Animations may be stored as directories of sprites, or as a single multiple
  35. image sprite file.
  36.  
  37. When saving animations as directories, Texture Garden does not offer support
  38. for going beyond the 76 file limit imposed by the filecore.  When playing back
  39. such animations, caching of images may be deselected, allowing replay from
  40. disc of animations which would otherwise not fit into memory.  These animations
  41.  may be played back on the backdrop by dragging a directory directly onto
  42. Texture Garden's icon bar icon.
  43.  
  44. When saving animations as multiple image sprite files, !ChangeFSI post-
  45. processing is not available, and when replaying these animations, there must
  46. be enough memory available to load the whole sequence.
  47.  
  48. Animations are generated mainly by altering the phase of the pseudo-random
  49. noise which is used in conjunction with filters when performing the program's
  50. fast-fourier-transforms.  Different frequencies are affected differently and
  51. the "Animation Type" specifies the way in which different frequencies are
  52. affected.
  53.  
  54. Two textures which look exactly the same may animate in different ways even
  55. if the same animation type is chosen; how they animate depends on their
  56. internal constitution, and not on their physical appearance.
  57.  
  58. The "Texture programmer" may design his own type of animation by using the
  59. "AnimationFrameNumber" variable which changes from &0 to &FFFF during the
  60. animation's course.
  61.  
  62. Texture Garden's batch processing options may be used for generating sequences
  63. of textures for animation purposes.  This can also be done from the command
  64. line if absolutely required.
  65.  
  66. Lastly, a word about alternatives to the animation viewing facilities provided.
  67.  
  68. Among the available Freeware on the platform are "!Picture" (written by mz
  69. Sophie Wilson and available from Acorn's FTP site) and "!Player" (Version
  70. 1.00 by Emmet Spier in 1990).  "!Picture" does not cache sprites, but is
  71. simple and neat.
  72.  
  73. "!Player" works well.  It is slightly faster than my own player due to its
  74. use of optimised plotting routines, it can scale plotted sprites and it has
  75. several other nifty widgets.  It needs to be fed a single multiple image 
  76. sprite file, and it takes its palette from the first sprite in the file.  This
  77. means you will probably need to edit the first sprite of an animation in
  78. !Paint to give it a palette.
  79.  
  80. "!Picture" too uses the default mode palette if none is specified by the
  81. sprite files.  One way of getting around this is to use the !ChangeFSI
  82. post-processing provided by Texture Garden which automatically adds the
  83. current desktop palette to the file.  Simpler, perhaps is to edit
  84. "!Picture"'s !RunImage program as follows:
  85.  
  86. 3250 spx%=-1:FOR Q%=0TO255:IFpixtrans%?Q%<>Q% spx%=pixtrans%
  87.  
  88. needs to be changed to:
  89.  
  90. 3250 spx%=-1:FOR Q%=0TO255:REM IFpixtrans%?Q%<>Q% spx%=pixtrans%
  91.  
  92. or similar (spx% should wind up as -1).
  93.  
  94.  
  95. 02 Exporting textures as JPEGs
  96. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  97. The fact that the program has a back-end interface to !ChangeFSI enables
  98. textures to be exported as JPEGs.  This is useful for use with World Wide Web
  99. pages.  JPEGs are usually to be preferred to GIFs for backgrounds as they
  100. have excellent colour depth and can be compressed very well.  Browsers
  101. lacking JPEG support are now rare.  Some synergy between the Fourier
  102. Transforms used by Textures Garden and the Discrete Cosine Transform used by
  103. JPEG may be partly responsible for this.  Compression is especially important
  104. for backgrounds as they are usually drawn first and consequentlt need to be
  105. downloaded before any navigation of the page can occur.  This is not true of
  106. other images as long as the "width" and "height" attributes are specified in
  107. the <img> tags.
  108.  
  109. There is explicit support for exporting JPEGs in the program.  Usually the user
  110. can just set the !ChangeFSI option and then select which JPEG options are
  111. required.  These options are overridden by any JPEG output commands specified
  112. in the options string.  For further documentation on the "JPEG" and "JPEGMONO"
  113. options, information is available inside !ChangeFSI.
  114.  
  115. Unfortunately, although the Computer Concepts "Colour Card Gold" graphics
  116. hardware is supported by Texture Garden, !ChangeFSI (v.1.15) does not recognise
  117. the CC-style 16bpp sprites and consequently fails to convert them to JPEGs
  118. correctly.  It seems to be confused about the aspect-ratio and the 
  119. colour-depth.  The aspect-ratio problem can be overcome using some of
  120. !ChangeFSI's resizing options, but colour-depth problem seems insoluble and
  121. the resulting washed out images are of little use.  Fortunately, a solution is
  122. at hand.  Texture Garden has options for forcing output to be in 16 or 24 bit
  123. colour.  When using these options, the output format follows Acorn's format,
  124. and consequently, !ChangeFSI can deal with the sprites.
  125.  
  126. When outputting images as JPEGs, it is important to make sure that you generate
  127. them at a high colour depth in the first place.  Using the force 24bpp option
  128. is recommended.  This is because JPEGs are 24 bit images, and using less than
  129. 24 bits in the source image actually generates larger files because the colour
  130. quantization introduced by using low colour depths is interpreted as being
  131. sharp edges, which JPEG does not compress well.
  132.  
  133. Animations may be exported as directories of JPEGs.  These may be played back
  134. using some programs (not Texture Garden), there seems to be little point in
  135. doing this.
  136.  
  137. 03 Creating 16 and 24 bpp files
  138. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  139. Texture Garden allows the export of 16 or 24 bit colour sprites from any display
  140. mode.  Old machines will have difficulty displaying these sprites, but they are
  141. recognised by !ChangeFSI.  Versions of RISC OS prior to version 3.5 are too
  142. primitive to display these "deep" sprites.  Fortunately, a patch for the
  143. operating system is available to allow them to be viewed as dithered images on
  144. older hardware.  This is called "Deeper" and is written by Sanjay Pattni.
  145. This patch is a module, and it was distributed recently on September's Acorn
  146. User cover disc.
  147.  
  148. The versions of the DragASprite module currently in existence do not seem to
  149. operate correctly on these pseudo-deep images.  If this does not look as though
  150. it will be rectified, reverting to dash boxes may be implemented.
  151.  
  152. Note that palette images are always created in the current mode, and are always
  153. displayed with Floyd-Steinberg dithering.  This may mean, that in modes with
  154. low colour depths they may look different from the textures they refer to.
  155.  
  156. This is because the textures are using simple dithering (usually for speed),
  157. and so the true colours of the palette are not being represented accurately.
  158.  
  159. Textures are not recreated in the current mode on a mode change.  A minor tip
  160. if you want a particular texture redrawn in its current position for some
  161. reason is that if you start to drag a texture, and press SHIFT as you drop it
  162. back onto its original position, then it gets redrawn in the current mode.
  163. If you also press ALT, then the texture is completely deleted.  This last may
  164. be of use to those working in conditions of restricted memory.
  165.  
  166.  
  167. 04 Menu tree conventions
  168. ~~~~~~~~~~~~~~~~~~~~~~~~
  169. When navigating through the palettes directory or the directory of animation
  170. types using the menu structures provided, some conventions are used for the
  171. sprites that are displayed on the left-hand side of the menus.
  172.  
  173. Normally the sprite naming conventions are as follows:
  174.  
  175.          File(S)    File(L)   Directory(S) Directory(L) App(S)  App(L) 
  176. Plain   :small_abc  file_abc  *name        #name        sm!xyz  !xyz 
  177. Selected:small_abc² file_abc² *name²       #name        sm!xyz² !xyz² 
  178. NoName  :small_xxx  file_xxx  small_dir    directory    sm_app  application 
  179. NoNameS :small_xxx² file_xxx² small_diro   directoryo   sm_appo applicationo
  180.  
  181. Small sprites are used when they are available; otherwise the large sprite is
  182. scaled.  If the selected version of the sprite is not available then the base
  183. sprite is inverted.  Conventions taken from !FilerPtch are also used.  In
  184. particular, "hidden" files are not displayed, to support the local directory
  185. display options of that program.
  186.  
  187. When selecting items from the menus, pressing SHIFT or ALT will alter the
  188. effect produced.  Generally SHIFT-clicking will load the file into a text
  189. editor, and ALT-clicking will open a Filer window onto the directory
  190. containing the selected item.  In the case of directories, clicking usually
  191. opens the parent of the directory clicked on.  SHIFT-clicking instead will
  192. open the selected directory itself.
  193.  
  194.  
  195. 05 Animation Types - details
  196. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  197. Animation Types are stored in the "Animatons" directory within Texture Garden.
  198. These control the way Texture Garden generates its animations.
  199.  
  200. Animations are generated mainly by altering the phase of the pseudo-random
  201. noise which is used in conjunction with filters when performing
  202. fast-fourier-transforms.  Different frequencies are affected differently and
  203. the "Animation Type" specifies the way in which different frequencies are
  204. affected.  Animation Types consist of a series of 1024 signed 4-bit values
  205. which are used as multipliers of the "animation phase" of different
  206. frequencies.  The animation phase is considered as coung from &0 - &FFFF, ie
  207. through one complete cycle in any animation.  If the phase multipliers are
  208. large then the animation will be violent and rapid.  If the multipliers are
  209. zero for all low frequencies then the animation will appear as a series of
  210. small ripples distorting a largely static display.  If the multipliers are
  211. zero for all high frequencies then the animation may look like big waves
  212. distorting an intricately patterned tapestry.  Many different types of
  213. animation are possible using this method.
  214.  
  215.  
  216. 06 Animation Types - file format
  217. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  218. Animation Types are stored as 512 byte files in the "Animatons" directory
  219. within Texture Garden.  Source for several example files is contained in the
  220. "Library.Source.Animations" directory.
  221.  
  222. The files are made up of 1024 signed 4-bit values.  Low frequency multipliers
  223. are stored first within each byte the lower frequency is in the lower bits
  224. (little endian).
  225.  
  226.  
  227. 07 The Mutator
  228. ~~~~~~~~~~~~~~
  229. When texture Garden mutates a texture into another one, its operation is
  230. quite simple.  It goes through the file and alters some of the numbers in the
  231. texture generation file.  The numbers are chosen according to the "mutation
  232. options" of the last command or function of the program.  These mutation
  233. options are specified by the programmer of the function.  Their possible
  234. values are listed in the "Extensions" file.
  235.  
  236.  
  237. 08 Breeding
  238. ~~~~~~~~~~~
  239. When two textures are mated with one another the program examines the code of
  240. the two textures for the "CreateTwoDimensionalTransform" and
  241. "CreateOneDimensionalTransform" commands.  Breeding mainly affects this type
  242. of command.  If one of the textures lacks both of these commands, then the
  243. two textures will be unable to breed.  For a texture to be fertile, it
  244. follows that it should always contain some such command.
  245.  
  246. For each occurrence of one of these commands in the "Mother" texture (paying
  247. heed to the "Mutate Colours" and "Mutate Textures" options) a random
  248. parameter of the command is chosen and deleted.  If this parameter is a
  249. function, then all its arguments are also deleted.  A chunk of code is taken
  250. at random from a "Create...Transform" in the "father" code.  This is then
  251. spliced along with any relevant parameters into the mother code at the chosen
  252. point.
  253.  
  254. The above mechanism allows textures to be of both sexes.  Note that almost
  255. the entire code comes from the "mother" texture, with the father donating a
  256. tiny quantity of code.  At the end of the breeding, the offspring is always
  257. given a new seed (for the pseudo-random number generator).
  258.  
  259.  
  260. 09 Three dimensional sculpting
  261. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  262. Support is provided for the production of three dimensional textures.  These
  263. are of use when textures need to be moulded to the surfaces of solid objects. 
  264. The most frequent application of this is when a texture is required that can
  265. be moulded around the surface of a sphere.
  266.  
  267. The two commands "DefineSolidBlock(Block_Description)" and
  268. "Sculpture(Path_of_X,Path_of_Y,Path_of_Z)" are used to perform this type of
  269. action.
  270.  
  271. The "DefineSolidBlock" command defines a solid block of texture in three
  272. dimensions.  "Block_Description" is a function of X,Y, and Z which usually
  273. refers to various buffers using the "Point"-type commands.
  274.  
  275. The "Sculpture(Path_of_X,Path_of_Y,Path_of_Z)" command sculpts a solid shape
  276. from the solid block of texture described in the last "DefineSolidBlock"
  277. command encountered.  The parameters, "Path_of_X", "Path_of_Y", "Path_of_Z",
  278. define a mapping between X and Y and the three dimensional space.  They are
  279. functions of X and Y.  The resulting shape is stored in the main two
  280. dimensional buffer.  It is usually best to enclose these commands inside the
  281. "StopMutating" and "StartMutating" pair.
  282.  
  283. One version of the command that defines a sphere is:
  284.  
  285. Sculpture(
  286. ScaledSignedMultiply(SignedCos(X),Absolute(SignedCos(LogicalShiftRight(Y,&1)))),
  287. SignedCos(LogicalShiftRight(Y,&1)),
  288. ScaledSignedMultiply(SignedSin(X),Absolute(SignedCos(LogicalShiftRight(Y,&1)))))
  289.  
  290. This is written on three lines to reveal its structure.  It is still quite a
  291. mouthful.  The advantage of specifying the shape explicitly is one of
  292. flexibility.  Smaller and larger spheres are possible, as are different
  293. shapes.
  294.  
  295.  
  296. 10 Dithering
  297. ~~~~~~~~~~~~
  298. There are now a number of dithering options available within Texture Garden.
  299. !ChangeFSI's superlative dithering methods may be used in addition to the
  300. native routines if needed, but in practice this is rarely required.
  301.  
  302. Texture Garden can use either simple random dithering, or a Floyd-Steinberg
  303. dithering technique.
  304.  
  305. With simple dithering using the "Dithering(Value)" command, if you use a lot of
  306. dithering to make an image look correct in a sixteen colour mode, then it will
  307. not look much better when changing to a sixteen million colour mode.  A command
  308. is provided to help with this called "ScaledDithering(Value)".  This scales the
  309. degree of dithering to the colour-depth of the current screen mode.
  310.  
  311. Floyd-Steinberg dithering may only be used in conjunction with the 24 bit
  312. virtual sprite commands.  It makes texture generation more time consuming.
  313.  
  314. Dithering may also be applied to palettes, where it can be applied separately
  315. to the colours components within whatever colour model is being used.
  316.  
  317.  
  318. 11 Resizing
  319. ~~~~~~~~~~~
  320. As described in the !Help file, dragging with SELECT on the bottom and
  321. right-hand edges of a texture initiates dynamic resizing.
  322.  
  323. There is something fundamentally square (literally) about the way in which 
  324. Texture Garden produces its extures.  The reason for this is the technical one
  325. that it is often faster to calculate FFTs at a size which is a power of two and
  326. then resize the result, than to do a FFT at the desired size.  If you want
  327. textures that are not square then there are several options available:
  328.  
  329. If the resized image needs to be displayed for selection in the Texture Garden,
  330. then using the built in resizing commands is strongly recommended.  This is
  331. most easily performed by using the "Resize" command an conjunction with the
  332. "ResizeSprite" command which are provided specifically for the purpose of
  333. resizing textures.  This is the recommended method of resizing textures, and it
  334. is the one used by the front-end provided for this purpose.
  335.  
  336. If a resize by XFactor and YFactor is required where
  337. (0 < XFactor < &10000, 0 < YFactor < &10000) then a...
  338. "Resize(XFactor, YFactor)" may be issued immediately before any "MakeSprite"
  339. commands are encountered, and a... 
  340. "ResizeSprite(XFactor, YFactor)" needs to occur just before the texture program
  341. terminates.
  342.  
  343. For the very technically minded the "ResizeSprite" command merely calls the
  344. "TruncateSpriteVertically(Y1,Y2)" and "TruncateSpriteHorizontally(X1,X2)"
  345. commands with their first parameter as zero.  These commands operate on the
  346. sprite generated by the program, chopping off its edges.  Note that although
  347. X1, X2, Y1 and Y2 range from 0 to &FFFF, X = 0, Y = 0 is at the bottom
  348. left-hand corner of the sprite and not, as usual, in the middle of the texture.
  349.  
  350. Equally technical: when the "Resize" command is issued three commands are built
  351. and issued.  They are roughly as follows
  352. "TwoDimensionalShift(&8000,&8000,Overwrite)"
  353. "TwoDimensionalProcess(0,0,XFactor,YFactor,TwoDimensionalPoint(
  354.    Multiply(&40000 DIV XFactor,LogicalShiftRight(X,&6)),
  355.    Multiply(&40000 DIV YFactor,LogicalShiftRight(Y,&6))),
  356.    Overwrite)".
  357. "TwoDimensionalShift(&8000,&8000,Overwrite)"
  358. This is close to what is actually used to resize the texture.
  359. When corresponding  "TruncateSpriteHorizontally(&0,XFactor)" and 
  360. "TruncateSpriteVertically(&0,YFactor)" are issued, the resulting image should
  361. tessellate, be the right shape and size and breed properly.  It will also
  362. be faster than if the resizing was done using !ChangeFSI, and will have had
  363. anti-aliasing techniques applied to it before translation to the current
  364. colour depth (better).
  365.  
  366. There are alternative methods available for resizing textures.  It is possible
  367. to resize manually by loading the generated sprite into a bitmap package and
  368. then trim it or resize it to the required size.  Trimming will clearly
  369. prevent seamless tessellation.  Resizing will preserve this, but may introduce
  370. some distortion.  One of the better ways to resize a resulting image is to
  371. use the scaling options of the !ChangeFSI post-processing available.  Using
  372. something like: "**#r 13:16 11:16 -nomode" would produce the desired effect.
  373.  
  374.  
  375. 12 Batch processing
  376. ~~~~~~~~~~~~~~~~~~~
  377. Batch processing is supported by Texture Garden.  If a textfile is dragged to
  378. the icon bar with the appropriate syntax, then it is used as a list of
  379. textures to be processed.  The syntax required for each line is as follows:
  380.  
  381. <infile> <outfile> <size>
  382.  
  383. where infile is the path of a texture generation file (note that this should
  384. always be a full path name), outfile is where the resulting sprite should be
  385. written to, and size is the desired size of the texture to be output.  This
  386. should always be a power of two.  Comments are allowed in batch files and they
  387. are taken to be any line starting with a "|".
  388.  
  389. Texture Garden also has the option to process batchfiles upon receiving a 
  390. request to do so from the command line.  It will only run in the desktop (i.e.
  391. not inside a task window), but it may be called from Obey files.  The syntax is:
  392.  
  393. "Run !TexturGdn -file <batchfile>".
  394.  
  395. The reason batchfiles have been supported is to allow maximum flexibility for
  396. those wishing to animate their textures.  It is in principle possible for users
  397. to machine generate a whole series of textures and then process them in bulk.
  398. Users who want to animate their textures in time with music (for example) may
  399. take a series of parameters from a MIDI source, a tracker file, or directly
  400. from the frequency spectrum of music sample and then use these as parameters
  401. when generating an appropriate texture.  If you are engaged in this type of
  402. activity, the author would be very pleased to hear from you.
  403.  
  404. There is one other command line option available.  This starts up Texture
  405. Garden with no icon bar icon.  The syntax for this is:
  406. "Run !TexturGdn -Remote".
  407.  
  408.  
  409. 13 Using !ChangeFSI
  410. ~~~~~~~~~~~~~~~~~~~         
  411. Post-processing of saved sprites and animations may be controlled by ticking
  412. the "Use !ChangeFSI" option.  
  413.  
  414. Two system variables are defined when using !ChangeFSI post processing of saved
  415. sprites: "<TextureGdn$File>" which contains the path of the existing sprite
  416. file and "<TextureGdn$Leaf>" which contains the leaf name from the same file. 
  417.  
  418. The !ChangeFSI-associated string provided contains the command line options
  419. required by this program.  Two special characters are used: "*" and "#". 
  420. Using "*" inserts "<TextureGdn$File> " (note the trailing space) into the
  421. command line string at that point and "#" inserts a string corresponding to the
  422. current mode.
  423.  
  424. The default setting for the string is "**#r -nomode".  This means that the
  425. existing sprite is overwritten and that processing is performed in the current
  426. screen mode.
  427.  
  428. If !ChangeFSI does not have enough memory to do its job then it can fail with
  429. unhelpful messages.  If this happens, the sprite will be left as it was when
  430. it was output from Texture Garden.  Please note that the system variable
  431. <TextureGdnChangeFSI$Mem> may be changed in Texture Garden's !Run file.
  432.  
  433. For further documentation on the options available, information is available
  434. from inside !ChangeFSI.
  435.  
  436.  
  437. 14 Virtual sprites and layering
  438. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  439. Virtual Sprites are 24-bit colour sprites in an internal format.
  440. They are created with the "MakeVirtualSprite(Type_R,Type_G,Type_B)" command
  441. and may be converted to RISC OS sprites using the "MakeSpriteFromVirtualSprite"
  442. command.
  443.  
  444. This method is useful when creating images by using multiple layers of texture.
  445.  
  446. Layers may be combined by specifing combination types for the red, green and
  447. blue components of the image using the "Type_R", "Type_G" and "Type_B"
  448. parameters.
  449.  
  450. It has some drawbacks when compared with the "traditional" method of using
  451. the "MakeSprite" and AddToSprite" commands.
  452.  
  453. The command is always slightly slower than the original method, and in 2, 4,
  454. 16, and 256 colour modes, it is much slower, as currently ColourTrans SWIs
  455. are used to perform the conversion.  Custom routines do the work in modes with
  456. 32K and 16M colours, so these are much faster.
  457.  
  458. Creating a virtual sprite also takes a chunk of memory which would otherwise
  459. not need to be allocated.
  460.  
  461. However, the range of textures capable of being generated has been massively
  462. increased by the addition of these commands.
  463.  
  464. More information concerning virtual sprites may be found in the "Language" file.
  465.  
  466. Sample textures illustrating these new methods are not currently provided with
  467. Texture Garden, but are available separately.
  468.  
  469.  
  470. 15 Milking the Freeware version
  471. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  472. Texture garden has two main limitations: textures edited by hand cannot be
  473. loaded by the program, and the maximum resolution depends on the colour depth.
  474. Both these restrictions are completely removed in the registered version.
  475.  
  476. The difficulties caused by the colour depth limitation may be minimised by
  477. using custom desktop palettes in 16 and 256 colour modes.  This can be done
  478. because Texture Garden reads its palette from the current screen mode and
  479. does not assume that you are using the default palette.
  480.  
  481. In a 16 colour mode 256x256 is the maximum size of texture that can be
  482. generated with the freeware version.  This is big enough for most purposes.
  483. If you then choose a custom palette to match a particular texture, the quality
  484. of the produced image can be much improved.
  485.  
  486. There are a couple of points to mention here:
  487.  
  488. Firstly, the texture will not be saved with a palette unless !ChangeFSI
  489. post-processing is used, so you will have to add one manually in !Paint.
  490.  
  491. Secondly, there are probably free programs which will take a 16M colour sprite
  492. and generate the "best fit" 16 or 256 colour palette.  Though unfortunately I
  493. have no details concerning these, such a program would be of use to anyone
  494. contemplating the proceedure described here.
  495.  
  496. 16 Bump mapping
  497. ~~~~~~~~~~~~~~~
  498. Most of the information relating to bumpmapping is with the relevant commands
  499. in the language file.
  500.  
  501. A number of corners have been cut in the ray-tracing routines to provide rapid
  502. texture generation.  Here is a description of some current limitations:
  503.  
  504. The program's implementation of Phong shading is still quit a lot like Gourad
  505. shading, though the difference is quite noticable.
  506.  
  507. No true shadowing routines exist, so no part of a texture can cast a shadow on
  508. another part.
  509.  
  510. Currently there are no ambient reflections from incoming rays, no mirror
  511. effects or translucency.
  512.  
  513. An approximation to the normals at each point is generated which introduces
  514. some minor non-linear distortion as the height of the light source changes.
  515.  
  516. Because many bump maps will have tall narrow peaks, shining a light from the
  517. side will produce significantly more illumination than shining one from above.
  518. This is a common cause of oversaturating colours.
  519.  
  520. All light sources are currently at infinity.  If closer light sources are ever
  521. implemented they will (by their nature) stop textures using them from
  522. tesselating.
  523.